package com.ldn.server.manage.controller;

import com.ldn.common.basic.dispose.exception.AppException;
import com.ldn.common.basic.utils.system.DataUtils;
import com.ldn.common.basic.utils.system.StrUtils;
import com.ldn.database.dao.entities.BasicEntities;
import com.ldn.database.dao.service.BasicService;
import com.ldn.server.manage.config.annotation.ServerManageController;

import java.util.List;

/**
 * 基础控制器
 * 用于实现基础及公用的方法
 *
 * @author 李大牛家的牛 (scafel@163.com)
 * @product serverless
 * @className BasicController
 * @createDate 2025/1/20 - 13:31
 * @description 基础控制器
 **/
@ServerManageController
public class BasicController {

    /**
     * 获取当前登录的管理员信息
     *
     * @return 当前登录的管理员信息
     * @throws AppException 登录异常 {@link AppException} 请先登录/管理员不存在
     */

    /**
     * 获取当前登录的管理员信息
     *
     * @param cache 是否尝试读取缓存中的数据
     * @return {@link ManageAdmin} 当前登录的管理员信息
     * @throws AppException 登录异常 {@link AppException} 请先登录/管理员不存在
     */

    /**
     * 获取当前登录的管理员角色信息
     *
     * @return {@link ManageRole} 当前登录的管理员角色信息
     * @throws AppException 登录异常 {@link AppException} 请先登录/管理员不存在
     */

    /**
     * 检查当前登录的管理员是否有对应权限
     *
     * @param actionStr 操作权限编码
     * @throws AppException 没有权限 {@link AppException} 没有权限
     */

    /**
     * 缓存当前登录的管理员信息
     *
     * @param admin {@link ManageAdmin} 当前登录的管理员信息
     */

    /**
     * 缓存当前登录的管理员角色信息
     *
     * @param admin {@link ManageAdmin} 当前登录的管理员信息
     * @param role  {@link ManageRole} 当前登录的管理员角色信息
     */

    /**
     * 缓存当前登录的管理员角色列表信息
     *
     * @param admin {@link ManageAdmin} 当前登录的管理员信息
     * @param roles {@link List<ManageRole>} 当前登录的管理员角色信息
     */

    /**
     * 缓存当前登录的管理员角色权限菜单信息
     * @param admin {@link ManageAdmin} 当前登录的管理员信息
     * @param rules {@link ManageRule} 当前登录的管理员角色权限菜单信息
     */

    /**
     * 缓存当前登录的管理员角色权限菜单操作信息
     * @param admin {@link ManageAdmin} 当前登录的管理员信息
     * @param actions {@link ManageRuleActions} 当前登录的管理员角色权限菜单操作信息
     */


    /**
     * 清除当前管理员的所有缓存
     *
     * @param admin {@link ManageAdmin} 当前登录的管理员信息
     */

    /**
     * 判断当前管理员是否是超级管理员
     *
     * @param admin {@link ManageAdmin} 当前登录的管理员信息
     * @return 是否是超级管理员
     */

    /**
     * 检查实体是否存在并验证是否可以修改
     *
     * @param enId  实体id
     * @param code  实体code
     * @param service  实体service
     * @return 实体
     */
    public <T extends BasicEntities> T checkEntityEdit(String enId, String code, BasicService<T> service) {
        T entity = checkEntityProtect(enId, code, service);
        if (entity.getStatus() == 1) {
            throw new AppException("该数据为已启用状态，不允许修改！");
        }
        return entity;
    }


    /**
     * 检查实体是否存在并在保护状态下
     *
     * @param enId  实体id
     * @param code  实体code
     * @param service  实体service
     * @return 实体
     */
    public  <T extends BasicEntities> T checkEntityProtect(String enId, String code, BasicService<T> service) {
        T entity = checkEntity(enId, code, service);
        if (entity.getProtect() == 1) {
            throw new AppException("该数据为保护状态，不允许修改状态！");
        }
        return entity;
    }

    /**
     * 检查实体是否存在
     *
     * @param enId  实体id
     * @param code  实体code
     * @param service  实体service
     * @return 实体
     */
    public <T extends BasicEntities> T checkEntity(String enId, String code, BasicService<T> service) {
        if (StrUtils.isBlank(enId) || StrUtils.isBlank(code)) {
            throw new AppException("参数传递异常！");
        }
        int id = Integer.parseInt(DataUtils.de(enId));
        T entity = service.getOneById(id);
        if (entity == null || StrUtils.compare(entity.getCode(), code, true) != 0) {
            throw new AppException("参数传递异常！");
        }
        return entity;
    }
}
